package cn.dlc.com.dongtaiganzhi;

import java.util.ArrayList;
import java.util.List;

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;

public class ZkClient {

	private static final String connectString = "192.168.182.88:2181,192.168.182.89:2181,192.168.182.90:2181";
	// 服务挂掉了，会有2000ms的延迟才知道这个服务器挂掉了
	private static final int sessionTimeout = 2000;
	// 统一创建一个父节点
	private static final String parentNode = "/servers";
	
	private ZooKeeper zkClient = null;
	
	// 存放服务器信息
	private volatile List<String> serverList;
	
	public void getConnect() throws Exception{
		zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {

			@Override
			public void process(WatchedEvent event) {
				try {
					// 连接的时候获取服务器列表
					getServerList();
				}catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
	
	/**
	 * 获取服务器信息列表
	 * @throws Exception
	 */
	public void  getServerList() throws Exception {
		// 获取这个节点下的所有节点信息
		List<String> children = zkClient.getChildren(parentNode, true);
		
		// 通过一个局部的list来存放服务器信息
		List<String> servers = new ArrayList<String>();
		for (String nodeName : children) {
			// 得到所有的子节点,第二个参数是watch，可以不用监听了
			byte[] data = zkClient.getData(parentNode + "/" + nodeName, false, null);
			servers.add(new String(data));
		}
		
		//设置给这个List，这样写安全一些，其实也会有问题，因为也不是线程安全的。
		serverList = servers;
		// 打印一下
		System.out.println(serverList);
	}
	
	/**
	 * 创建一个模拟业务
	 */
	public void bussiness() throws Exception{
		System.out.println("client start working...");
		Thread.sleep(Long.MAX_VALUE);
	}
	
	public static void main(String[] args) throws Exception{
		ZkClient zkClient2 = new ZkClient();
		zkClient2.getConnect();
		
		// 获取服务器列表
		zkClient2.getServerList();
		// 业务
		zkClient2.bussiness();
	}
	
}
